package com.jintu.portal.service.impl;

import com.jintu.portal.pojo.bean.Filter;
import com.jintu.portal.pojo.bean.LogicDelete;
import com.jintu.portal.pojo.bean.QLBuilder;
import com.jintu.portal.pojo.bean.SystemType;
import com.jintu.portal.pojo.dto.UserDto;
import com.jintu.portal.pojo.entity.TCompany;
import com.jintu.portal.pojo.entity.TUser;
import com.jintu.portal.pojo.entity.TUserRole;
import com.jintu.portal.repository.mysql.dao.CompanyDao;
import com.jintu.portal.repository.mysql.dao.UserDao;
import com.jintu.portal.repository.mysql.dao.UserRoleDao;
import com.jintu.portal.service.CommonUserService;
import com.jintu.portal.utils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import java.util.*;

/**
 * Created by liyou on 2017/9/26.
 */
@Repository
public class CommonUserServiceImpl implements CommonUserService {

    @Resource
    private UserDao userDao;

    @Resource
    private UserRoleDao userRoleDao;

    @Resource
    private CompanyDao companyDao;

//    @Autowired
//    private CompanyContractDao companyContractDao;
//
//    @Autowired
//    private PermissionDao permissionDao;
//
//    @Autowired
//    private CommonService commonService;
//
//    @Autowired
//    private UserDepartmentPostDao userDepartmentPostDao;

//    public UserDto login(String username, String pwd, SystemType systemType) throws Exception {
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("username", username));
//        ql.and(Filter.eq("system", systemType.getValue()));
//        ql.and(Filter.eq("logicDelete", LogicDelete.NOT_DELETE.getValue()));
//        TUser user = userDao.findOneByJpql(ql);
//
//        if(user == null || !user.getPassword().equals(StringUtil.toMD5(username+pwd))) {
//            throw new ServiceException("您输入的账号或者密码不正确，请重新输入");
//        }
//
//        TCompany company = companyDao.get(user.getCompanyId());
//        if(company.getIsUsed() == IsUsed.NOT_USED.getValue()) {
//            throw new ServiceException("该公司已被停止服务");
//        }
//
//        ql = new QLBuilder();
//        ql.and(Filter.eq("userId", user.getId()));
//        TUserRole userRole = userRoleDao.findOneByJpql(ql);
//        if(userRole == null) {
//            throw new ServiceException("该用户没有设置可用角色");
//        }
//
//        //移除上次登录的token信息
//        UserUtil.removeAdminUser(user.getId());
//
//        //生成登录token信息
//        UserDto userDto = BeanUtils.copyProperties(user, UserDto.class);
//        userDto.setMenuList(userMenuList(userDto,userRole.getRoleId(), systemType));
//        userDto.setPermissions(userPermissions(userRole.getRoleId(), systemType));
//        userDto.setCompanyName(company.getFullName());
//        ql = new QLBuilder();
//        ql.and(Filter.eq("companyId", company.getId()));
//        TCompanyContract companyContract = companyContractDao.findOneByJpql(ql);
//        if(companyContract != null) {
//            userDto.setMybankStatus(companyContract.getMybankStatus());
//        }
//        String key = null;
//        for (int i = 0; i < 5; i++) {
//            key = UserUtil.USER_TOKEN_KEY_HEADER + ":" + StringUtil.getUUID();
//            if(!RedisUtil.INSTANCE.exists(key)) {
//                break;
//            }
//        }
//        RedisUtil.INSTANCE.set(key, userDto, UserUtil.ADMIN_USER_EXPIRE);
//
//        StringBuffer userRoleKey = new StringBuffer();
//        userRoleKey.append(key).append(":company:").append(user.getCompanyId()).append(":role:").append(userRole.getRoleId()).append(":user:").append(user.getId());
//        RedisUtil.INSTANCE.set(userRoleKey.toString(), key, UserUtil.ADMIN_USER_EXPIRE);
//
//        //添加浏览器cookie信息
//        String cookieName = "";
//        if(systemType.getValue().equals(SystemType.CA_SYSTEM.getValue())) {
//            cookieName = UserUtil.CA_USER_COOKIE_KEY;
//        }else if(systemType.getValue().equals(SystemType.OP_SYSTEM.getValue())) {
//            cookieName = UserUtil.OP_USER_COOKIE_KEY;
//        }
//        Cookie cookie = new Cookie(cookieName, key);
//        cookie.setMaxAge(-1);
//        cookie.setPath("/");
//        SessionUtil.getResponse().addCookie(cookie);
//
//        return userDto;
//    }
//
//    /**
//     * 根据openid登陆op
//     * @param openId
//     * @return
//     * @throws Exception
//     */
//    public UserDto loginByOpenId(String openId) throws Exception {
//        if(StringUtil.isEmpty(openId)){
//            return null;
//        }
//        /*QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("openId", openId));
//        ql.and(Filter.eq("addType", AddType.INIT.getValue()));
//        ql.and(Filter.eq("system", SystemType.OP_SYSTEM.getValue()));
//        ql.and(Filter.eq("logicDelete", LogicDelete.NOT_DELETE.getValue()));
//        TUser user = userDao.findOneByJpql(ql);*/
//        //过滤掉企业状态为依据停用的商户
//        String sql = "SELECT tuser.id, tuser.username,tuser.realname,tuser.username phone,tuser.birthday birthdy,tuser.company_id companyId,tuser.status,tuser.client_id clientId," +
//                " tuser.open_id openId,tuser.add_type addType,tuser.headimg_url headimgUrl,tuser.qq,tuser.wx,tuser.refund_right refundRight " +
//                " from t_user tuser,t_company tc \n" +
//                " WHERE tuser.company_id=tc.id and tuser.system="+SystemType.OP_SYSTEM.getValue()+" and tuser.add_type="+AddType.INIT.getValue() +
//                " and tuser.logic_delete ="+LogicDelete.NOT_DELETE.getValue()+" and tc.is_used="+IsUsed.USED.getValue()+" and open_id='"+openId+"'";
//        TUser user = userDao.findOneBySql(sql,TUser.class);
//        if(user == null) {
//            return null;
//        }
//        UserDto userDto = createUserDto(user);
//        return userDto;
//    }
//
//    @Transactional
//    public void modifyPwd(ModifyPwdDto modifyPwdDto, SystemType systemType) {
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("username", modifyPwdDto.getUsername()));
//        ql.and(Filter.eq("logicDelete", LogicDelete.NOT_DELETE.getValue()));
//        ql.and(Filter.eq("system", systemType.getValue()));
//        TUser user = userDao.findOneByJpql(ql);
//        if(user == null) {
//            throw new ServiceException("您输入的登录账号不存在，请重新输入");
//        }
//        if(SystemType.B_APP_SYSTEM.getValue().equals(systemType.getValue())) {
//            if(!user.getPassword().equals(StringUtil.toMD5(modifyPwdDto.getUsername()+modifyPwdDto.getOldPwd()))) {
//                throw new ServiceException("原密码不正确");
//            }
//        }
//        String password = StringUtil.toMD5(modifyPwdDto.getUsername()+modifyPwdDto.getPwd());
//        user.setPassword(password);
//        userDao.update(user);
//    }
//
//    @Transactional
//    public void modifyPwd(ChangePwdDto changePwdDto, SystemType systemType) {
//        TUser user = userDao.get(changePwdDto.getUserId());
//        if(!systemType.getValue().equals(user.getSystem())) {
//            throw new ServiceException("你没有操作该资源的权限");
//        }
//        if(!user.getPassword().equals(StringUtil.toMD5(user.getUsername()+changePwdDto.getOldPwd()))) {
//            throw new ServiceException("原密码不正确");
//        }
//        user.setPassword(StringUtil.toMD5(user.getUsername()+changePwdDto.getPwd()));
//        userDao.update(user);
//    }
//
//    public List<AdminUserDto> adminUserList(SystemType systemType, Long companyId) {
//        QLBuilder ql = new QLBuilder();
//        ql.setMainClause("SELECT new com.drip.common.dto.org.AdminUserDto(tu, tr) FROM TUser tu, TUserRole tur, TRole tr WHERE tu.id = tur.userId and tr.id = tur.roleId");
//        ql.and(Filter.eq("tu.system", systemType.getValue()));
//        ql.and(Filter.eq("tu.logicDelete", LogicDelete.NOT_DELETE.getValue()));
//        if(companyId != null) {
//            ql.and(Filter.eq("tu.companyId", companyId));
//        }
//        return userDao.findManyByJpql(ql);
//    }
//
//    @Transactional
//    public TUser addAdminUser(AdminUserAddDto addDto, SystemType systemType) {
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("username", addDto.getPhone()));
//        ql.and(Filter.eq("system", systemType.getValue()));
//        ql.and(Filter.eq("logicDelete", LogicDelete.NOT_DELETE.getValue()));
//        TUser user = userDao.findOneByJpql(ql);
//
//        if(systemType.getValue() == SystemType.OP_SYSTEM.getValue()) {
//            if(user != null) {
//                ql = new QLBuilder();
//                ql.and(Filter.eq("companyId", user.getCompanyId()));
//                ql.and(Filter.eq("mybankStatus", MyBankStatus.CHECK_SUCC.getValue()));
//                TCompanyContract companyContract = companyContractDao.findOneByJpql(ql);
//                if(companyContract != null) {
//                    throw new ServiceException("该手机号已经在商家运营平台注册，不能重复注册");
//                }else {
//                    user.setRealname(addDto.getName());
//                    user.setUpdateTime(new Date());
//                    user.setUpdater(UserUtil.currentUser().getId());
//                    user.setAddType(AddType.ADD.getValue());
//                    user.setCompanyId(UserUtil.currentUser().getCompanyId());
//                    userDao.update(user);
//                }
//            }
//        }else {
//            if(user != null) {
//                throw new ServiceException("该手机号已经在商家运营平台注册，不能重复注册");
//            }
//        }
//
//        String key = addDto.getPhone()+systemType.getValue();
//        if(!RedisUtil.INSTANCE.setnx(key, addDto.getPhone(), 10)) {
//            throw new ServiceException("系统繁忙，请稍后再试");
//        }
//        if(user == null) {
//            user = new TUser();
//            user.setSystem(systemType.getValue());
//            user.setAddType(AddType.ADD.getValue());
//            user.setLogicDelete(LogicDelete.NOT_DELETE.getValue());
//            user.setUsername(addDto.getPhone());
//            user.setRealname(addDto.getName());
//            user.setPassword(StringUtil.toMD5(user.getUsername()+addDto.getPwd()));
//            user.setCreateTime(new Date());
//            user.setCreator(UserUtil.currentUser().getId());
//            user.setUpdateTime(user.getCreateTime());
//            user.setUpdater(UserUtil.currentUser().getId());
//            user.setCompanyId(UserUtil.currentUser().getCompanyId());
//            userDao.insert(user);
//        }
//
//        ql = new QLBuilder();
//        ql.and(Filter.eq("userId", user.getId()));
//        TUserRole oldUserRole = userRoleDao.findOneByJpql(ql);
//        if(oldUserRole != null) {
//            if(!oldUserRole.getRoleId().equals(addDto.getRoleId())) {
//                UserUtil.expireUser(oldUserRole.getUserId());
//            }
//            userRoleDao.delete(oldUserRole.getId());
//        }
//
//        TUserRole userRole = new TUserRole();
//        userRole.setUserId(user.getId());
//        userRole.setRoleId(addDto.getRoleId());
//        userRoleDao.insert(userRole);
//        return user;
//    }
//
//    @Transactional
//    public TUser updateAdminUser(AdminUserUpdateDto updateDto, SystemType systemType) {
//        TUser user = userDao.get(updateDto.getUserId());
//        if(user.getSystem() != systemType.getValue() || user.getAddType() == AddType.INIT.getValue()) {
//            throw new ServiceException("你没有操作该资源的权限");
//        }
//        user.setRealname(updateDto.getName());
//        user.setUpdateTime(new Date());
//        user.setUpdater(UserUtil.currentUser().getId());
//        userDao.update(user);
//
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("userId", user.getId()));
//        TUserRole oldUserRole = userRoleDao.findOneByJpql(ql);
//        if(!oldUserRole.getRoleId().equals(updateDto.getRoleId())) {
//            UserUtil.expireUser(oldUserRole.getUserId());
//        }
//        userRoleDao.delete(oldUserRole.getId());
//
//        TUserRole userRole = new TUserRole();
//        userRole.setUserId(user.getId());
//        userRole.setRoleId(updateDto.getRoleId());
//        userRoleDao.insert(userRole);
//        return user;
//    }
//
//    @Transactional
//    public TUser deleteAdminUser(Long userId, SystemType systemType) {
//        TUser user = userDao.get(userId);
//        if(user.getSystem() != systemType.getValue() || user.getAddType() == AddType.INIT.getValue()) {
//            throw new ServiceException("你没有操作该资源的权限");
//        }
//        user.setUpdateTime(new Date());
//        user.setUpdater(UserUtil.currentUser().getId());
//        user.setLogicDelete(LogicDelete.DELETE.getValue());
//        userDao.update(user);
//
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("userId", userId));
//        userRoleDao.deleteByJpql(ql);
//
//        UserUtil.expireUser(userId);
//        return user;
//    }

    public UserDto findUserByPhone(String phone, SystemType systemType) throws Exception {
        QLBuilder ql = new QLBuilder();
        ql.and(Filter.eq("username", phone));
        ql.and(Filter.eq("system", systemType.getValue()));
        ql.and(Filter.eq("logicDelete", LogicDelete.NOT_DELETE.getValue()));
        TUser user = userDao.findOneByJpql(ql);
        if(user == null){
            return null;
        }
        UserDto userDto = BeanUtils.copyProperties(user, UserDto.class);
        TCompany company = companyDao.get(user.getCompanyId());
        userDto.setCompanyName(company.getFullName());
        userDto.setCompanyShortName(company.getShortName());
        ql = new QLBuilder();
        ql.and(Filter.eq("userId", user.getId()));
        TUserRole userRole = userRoleDao.findOneByJpql(ql);
        if(userRole != null ){
            userDto.setRoleId(userRole.getRoleId());
        }
        return userDto;
    }

//    public UserDto findUserById(Long userId) throws Exception {
//        TUser user = userDao.get(userId);
//        if(user == null){
//            return null;
//        }
//        UserDto userDto = BeanUtils.copyProperties(user, UserDto.class);
//        TCompany company = companyDao.get(user.getCompanyId());
//        userDto.setCompanyName(company.getFullName());
//
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("userId", user.getId()));
//        TUserRole userRole = userRoleDao.findOneByJpql(ql);
//        if(userRole != null ){
//            userDto.setRoleId(userRole.getRoleId());
//        }
//        return userDto;
//    }
//
//    public TUser findInitAdminUser(Long companyId) {
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("companyId", companyId));
//        ql.and(Filter.eq("system", SystemType.OP_SYSTEM.getValue()));
//        ql.and(Filter.eq("addType", AddType.INIT.getValue()));
//        ql.and(Filter.eq("logicDelete", LogicDelete.NOT_DELETE.getValue()));
//        return userDao.findOneByJpql(ql);
//    }
//
//    /**
//     * 查询OP初始化的管理员用户
//     * @param phone
//     * @return
//     */
//    public TUser findOpInitAdminUser(String phone){
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("username",phone));
//        ql.and(Filter.eq("system", SystemType.OP_SYSTEM.getValue()));
//        ql.and(Filter.eq("addType", AddType.INIT.getValue()));
//        ql.and(Filter.eq("logicDelete", LogicDelete.NOT_DELETE.getValue()));
//        TUser user = userDao.findOneByJpql(ql);
//        return user;
//    }
//
//    /**
//     * 生活号,商户系统手机号绑定登录
//     * @param username
//     * @param vaildCode
//     * @return
//     */
//    @Transactional
//    public UserDto opBindLogin(String username,String vaildCode) throws Exception{
//        //校验验证码
//        //是否错误
//        String codeError = RedisUtil.INSTANCE.get("opBindCodeError"+username);
//        if(!vaildCode.equals(codeError)) {
//            throw new ServiceException("验证码错误!");
//        }
//        //是否失效
//        Date activeTime = RedisUtil.INSTANCE.get("opBindCodeAbate"+username,Date.class);
//        if(activeTime == null){
//            throw new ServiceException("获取验证码异常!");
//        }
//        if(DateUtil.getBetweenDateSecond(activeTime,new Date()) > 300) {
//            throw new ServiceException("验证码已失效，请重新获取!");
//        }
//
//        //校验用户信息
//        TUser user = findOpInitAdminUser(username);
//        if(user == null) {
//            throw new ServiceException("您未注册瀑布圈子商户,请联系小瀑科技入驻");
//        }
//
//        if(StringUtil.isNotBlank(user.getOpenId())){
//            throw new ServiceException("该手机号已绑定,请先解绑");
//        }else{
//            user.setOpenId(AlipayUtil.getAlipayOpenId());
//        }
//        UserDto userDto = createUserDto(user);
//        if(userDto == null){
//            throw new ServiceException("您未注册瀑布圈子商户,请联系小瀑科技入驻");
//        }
//        userDao.update(user);
//
//        //绑定成功后清除验证码信息
//        if(StringUtil.isNotEmpty(codeError)){
//            RedisUtil.INSTANCE.delete("opBindCodeError"+username);
//        }
//
//        return userDto;
//    }
//
//    /**
//     * 生活号,商户系统解除绑定
//     * @throws Exception
//     */
//    @Transactional
//    public void opUnbound() throws Exception{
//        UserDto userDto = UserUtil.currentOpUser();
//        if(userDto != null){
//            TUser user = userDao.get(userDto.getId());
//            user.setOpenId(null);
//            userDao.update(user);
//        }
//        UserUtil.removeOpUser();
//    }
//
//    /**
//     * 生成登录信息
//     * @param user
//     * @return
//     * @throws Exception
//     */
//    private UserDto createUserDto(TUser user) throws Exception{
//        TCompany company = companyDao.get(user.getCompanyId());
//        if(company.getIsUsed() == IsUsed.NOT_USED.getValue()) {
//            return null;
//        }
//
//        QLBuilder ql = new QLBuilder();
//        ql.and(Filter.eq("userId", user.getId()));
//        TUserRole userRole = userRoleDao.findOneByJpql(ql);
//        if(userRole == null) {
//            return null;
//        }
//
//        //移除上次登录的token信息
//        UserUtil.removeOpUser();
//
//        //生成登录token信息
//        UserDto userDto = BeanUtils.copyProperties(user, UserDto.class);
//        userDto.setCompanyName(company.getFullName());
//        userDto.setCompanyShortName(company.getShortName());
//        ql = new QLBuilder();
//        ql.and(Filter.eq("companyId", company.getId()));
//        TCompanyContract companyContract = companyContractDao.findOneByJpql(ql);
//        if(companyContract != null) {
//            userDto.setMybankStatus(companyContract.getMybankStatus());
//        }
//
//        String opKey = UserUtil.OP_USER_AGENCY__KEY+user.getOpenId();
//        RedisUtil.INSTANCE.set(opKey, userDto,UserUtil.ADMIN_USER_EXPIRE);
//
//        return userDto;
//    }
//
//    public List<MenuDto> userMenuList(UserDto userDto,Long roleId, SystemType systemType) {
//        StringBuffer sb = new StringBuffer();
//        sb.append("select tm.name, tm.full_path fullPath, tm.link, tm.img_url imgUrl,tm.sort from t_menu tm, t_source_action tsa, t_permission tp " +
//                "where tm.id = tsa.action_val and tsa.type = :type and (tp.action_id = tsa.id or tp.action_id = '*') " +
//                "and tp.subject_id = :subjectId and tp.subject_type = :subjectType ");
//        sb.append("and tm.system = :system group by tm.id order by tm.full_path");
//        List<Object> params = new ArrayList<Object>();
//        params.add(SourceActionType.MENU.getValue());
//        params.add(roleId);
//        params.add(SubjectType.ROLE.getValue());
//        params.add(systemType.getValue());
//        List<MenuDto> list =  permissionDao.findManyBySql(sb.toString(), MenuDto.class, params.toArray());
//
//        String fullPath = null;
//        List<MenuDto> menuList = new ArrayList<MenuDto>();
//        MenuDto firstItem = null;
//        for (MenuDto menuDto : list) {
//            if(fullPath == null || !menuDto.getFullPath().startsWith(fullPath)) {
//                fullPath = menuDto.getFullPath();
//                firstItem = menuDto;
//                firstItem.setItems(new ArrayList<MenuDto>());
//                menuList.add(firstItem);
//            }else {
//                firstItem.getItems().add(menuDto);
//            }
//        }
//
//        if(menuList != null && menuList.size() > 0){
//            menuSort(menuList);
//        }
//
//        boolean isShowSmsMenu = false;
//        if(AddType.INIT.getValue() == userDto.getAddType()) {//公司开了短信，并且是公司超管返回true
//            List<TStaticData> smsCompanyList = commonService.findDataByCode(StaticDataConstants.SMS_COMPANYS);
//            if(!CollectionUtils.isEmpty(smsCompanyList)) {
//                String companyIdStr = smsCompanyList.get(0).getVal();
//                String[] companyIds = companyIdStr.split(",");
//                for(String companyId:companyIds) {
//                    if(companyId.equals(userDto.getCompanyId() + "")) {
//                        isShowSmsMenu = true;
//                    }
//                }
//            }
//        }
//        if(isShowSmsMenu) {
//            MenuDto smsMenu = new MenuDto();
//            smsMenu.setName("增值");
//            smsMenu.setImgUrl("arrow-graph-up-right");
//            List<MenuDto> items = new ArrayList<MenuDto>();
//            MenuDto itemMenu = new MenuDto();
//            itemMenu.setName("短信业务");
//            itemMenu.setLink("/sms/index");
//            items.add(itemMenu);
//            smsMenu.setItems(items);
//            menuList.add(2,smsMenu);
//        }
//        return menuList;
//    }
//
//    public List<String> userPermissions(Long roleId, SystemType systemType) {
//        StringBuffer sb = new StringBuffer();
//        sb.append("select tm.permission from t_menu tm, t_source_action tsa, t_permission tp " +
//                "where tm.id = tsa.action_val and tsa.type = :type and (tp.action_id = tsa.id or tp.action_id = '*') " +
//                "and tp.subject_id = :subjectId and tp.subject_type = :subjectType ");
//        sb.append("and tm.system = :system and tm.permission is not null group by tm.id order by tm.full_path");
//        List<Object> params = new ArrayList<Object>();
//        params.add(SourceActionType.MENU.getValue());
//        params.add(roleId);
//        params.add(SubjectType.ROLE.getValue());
//        params.add(systemType.getValue());
//        List<MenuDto> list =  permissionDao.findManyBySql(sb.toString(), MenuDto.class, params.toArray());
//        List<String> permissionList = new ArrayList<String>();
//        for (MenuDto menuDto : list) {
//            if(StringUtil.isBlank(menuDto.getPermission())) {
//                continue;
//            }
//            permissionList.add(menuDto.getPermission());
//        }
//        return permissionList;
//    }
//
//    //菜单排序
//    private static void menuSort(List<MenuDto> data) {
//        Collections.sort(data, new Comparator<MenuDto>() {
//            public int compare(MenuDto o1, MenuDto o2) {
//                Integer a = o1.getSort();
//                Integer b = o2.getSort();
//                // 升序
//                return a.compareTo(b);
//                // 降序
//                //return b.compareTo(a);
//            }
//        });
//    }
}
